package main

import (
	"fmt"
	"math"
	"sort"
)

/* ===== topic1：实现对圆形、三角形、长方形求面积 ===== */
type Areaer interface{ area() float64 }

// 定义相关结构体
type Circle struct{ r float64 }
type Triangle struct{ base, height float64 }
type Rectangle struct{ long, width float64 }

// 创建构造函数
func NewCircle(r float64) *Circle {
	c := new(Circle)
	c.r = r
	return c
}

func NewTriangle(base, height float64) *Triangle {
	t := new(Triangle)
	t.base = base
	t.height = height
	return t
}

func NewRectangle(long, width float64) *Rectangle {
	r := new(Rectangle)
	r.long = long
	r.width = width
	return r
}

// 实现求圆形面积方法
func (c *Circle) area() float64 {
	return math.Pi * c.r * c.r
}

// 实现求三角形面积方法
func (t *Triangle) area() float64 {
	return (t.base * t.height) / 2
}

// 实现求矩形面积方法
func (r *Rectangle) area() float64 {
	return r.long * r.width
}

func main() {
	// 计算圆形的面积
	circle := NewCircle(5.8)
	var c Areaer = circle
	fmt.Printf("所要求的圆形面积为：%.2f\n", c.area())

	// 计算三角形的面积
	triangle := NewTriangle(5, 6.5)
	var t Areaer = triangle
	fmt.Printf("所要求的三角形面积为：%.2f\n", t.area())

	// 计算矩形的面积
	rectangle := NewRectangle(6.6, 8.8)
	var r Areaer = rectangle
	fmt.Printf("所要求的三角形面积为：%.2f\n", r.area())

	/* ===== topic2：利用第一题，构造3个以上图形，至少圆形、三角形、矩形各有一个，对上题的图形按照面积降序排列 ===== */
	areas := []Areaer{c, t, r} // 字面量定义切片,这是这个切片的len和cap都是3
	sort.Slice(areas, func(i, j int) bool {
		return areas[i].area() > areas[j].area()
	})
	fmt.Println("前面所求的图形面积降序排列为：")
	for _, area := range areas {
		fmt.Printf("%.2f\n", area.area())
	}
}

// 阿飞老师的批改
// 实现逻辑清晰，结果正确，存在的小问题是面积计算时，或者构造函数初始化时，对特殊值的处理;
// 例如负值、0等。
